package fr.iut2.tc1.client;

import java.util.ArrayList;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.AbsolutePanel;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.VerticalPanel;

import fr.iut2.tc1.shared.Race;
import fr.iut2.tc1.shared.UnTroll;


//vu permettant de selectionner un troll dans la liste pour afficher ses proprietes
public class TrollList extends Composite implements ClickHandler, ChangeHandler
{
	
	private static final Lang LANG = GWT.create(Lang.class);
	
	
	private VerticalPanel page;
	private HorizontalPanel panelPrincipal;
	private VerticalPanel pannelGauche;
	private VerticalPanel pannelMiddle;
	private VerticalPanel pannelDroite;
	private Button passerVueImage;
	private Button changeLang;
	private Image imageTroll;
	private AbsolutePanel header;
	private AbsolutePanel footer;
	
	private TrollNameList listeDesNoms;
	private ListeCaract listeCarac;
	private ArrayList<TrollResultSerialized> sauvegardeTroll;
	
	private HorizontalPanel panelBoutons;
	private Button boutonModifier;
	private Button boutonNouveau;
	private Button boutonSupprimer;
	
	private String[] lesRaces;
	private ListBox listeRace;
	
	//SINGLETON
	private static TrollList SINGLETON;
	
	public TrollList(ArrayList<TrollResultSerialized> result)
	{
		SINGLETON = this;
		sauvegardeTroll=result;
		lesRaces=Race.getRacesPlusAll();
		
		//Les panneau
		page = new VerticalPanel();
		
		header = new AbsolutePanel();
		header.setStyleName("header");
		page.add(header);
		
		//Titre
		Label titre = new Label(LANG.titre());
		titre.setStyleName("titre");
		header.add(titre);
		
		
		//Bouton pour passer en vue 'image'
		passerVueImage = new Button(LANG.bouton1());
		passerVueImage.setStyleName("btn btnOtherView");
		passerVueImage.addClickHandler(this);
		header.add(passerVueImage);
		
		
		//Bouton pour passer en anglais
		changeLang = new Button(LANG.bouton2());
		changeLang.setStyleName("btnLang");
		changeLang.addClickHandler(this);
		header.add(changeLang);
		
		//header.add(new Label("Tri par race de Troll :"));
		
		//Tri par race
		listeRace = new ListBox();
		listeRace.addChangeHandler(this);
		//On ajoute les races
		for(int i=0;i<lesRaces.length;i++)
		{
			listeRace.addItem(lesRaces[i]);
		}
		listeRace.setSelectedIndex(listeRace.getItemCount()-1);
		header.add(listeRace);
		
		//Panel contenant la partie gauche, millieu et droite de la page
		panelPrincipal = new HorizontalPanel();
		page.add(panelPrincipal);
		
		//Partie gauche de la page
		pannelGauche = new VerticalPanel();
		panelPrincipal.add(pannelGauche);
		pannelGauche.setStyleName("pannelGauche");
		
		//Widget affichant la liste des noms
		listeDesNoms = new TrollNameList(sauvegardeTroll);
		pannelGauche.add(listeDesNoms);
		

		//Partie millieu de la page
		pannelMiddle = new VerticalPanel();
		panelPrincipal.add(pannelMiddle);
		pannelMiddle.setStyleName("pannelMiddle");
				
		//Image dans le panneau du milieu
		this.imageTroll = new Image();
		this.imageTroll.setStyleName("imageAffichageTrollList");
		pannelMiddle.add(this.imageTroll);
		
		//Partie droite de la page
		pannelDroite = new VerticalPanel();
		panelPrincipal.add(pannelDroite);
		pannelDroite.setStyleName("pannelDroite");
		
		//Widget affichant les caractéristique et compétences
		listeCarac = new ListeCaract();
		pannelDroite.add(listeCarac);
		
		
		//Les boutons de modification/suppression/ajout
		panelBoutons = new HorizontalPanel();
		panelBoutons.addStyleName("paneauBoutons");
		page.add(panelBoutons);
		
		boutonNouveau = new Button(LANG.boutonNouveau());
		boutonNouveau.addStyleName("btnControl");
		boutonNouveau.addClickHandler(this);
		boutonModifier = new Button(LANG.boutonModif());
		boutonModifier.addStyleName("btnControl");
		boutonModifier.addClickHandler(this);
		boutonSupprimer = new Button(LANG.boutonSuppr());
		boutonSupprimer.addStyleName("btnControl");
		boutonSupprimer.addClickHandler(this);
		
		panelBoutons.add(boutonNouveau);
		panelBoutons.add(boutonModifier);
		panelBoutons.add(boutonSupprimer);
		
		//footer
		footer = new AbsolutePanel();
		footer.setStyleName("footer");
		page.add(footer);
		
		//Initialisation du widget
		initWidget(page);
		
		// Style du widget
	    setStyleName("page");
	}
	
	//SINGLETON
	public static TrollList get() 
	{
		return SINGLETON;
	}
	
	public Image getImageTroll()
	{
		return imageTroll;
	}

	@Override
	public void onClick(ClickEvent event) 
	{
		if(event.getSource()==this.passerVueImage)
		{
			Troll.get().changerPage(1);
		}
		if(event.getSource()==this.boutonSupprimer)
		{
			if(!this.listeDesNoms.getTrollFocus().equals(""))
			{
				Troll.get().supprimerTroll(this.listeDesNoms.getTrollFocus());
			}
		}
		if(event.getSource()==this.boutonModifier)
		{
			UnTroll trollToModif;
			boolean trouve=false;
			
			for(int i=0;i<sauvegardeTroll.size();i++)
			{
				if(sauvegardeTroll.get(i).getName().equals(this.listeDesNoms.getTrollFocus()))
				{
					trollToModif = new UnTroll(sauvegardeTroll.get(i).getName(),sauvegardeTroll.get(i).getRace(),sauvegardeTroll.get(i).getNomImage());
					trollToModif.setCaracteristiques(sauvegardeTroll.get(i).getAttaque(), sauvegardeTroll.get(i).getDegat(), sauvegardeTroll.get(i).getEsquive(), sauvegardeTroll.get(i).getRegeneration(), sauvegardeTroll.get(i).getVie());
					trollToModif.setPointsCompetence(sauvegardeTroll.get(i).getComp1(), sauvegardeTroll.get(i).getComp2());
					
		 		//On envoie le troll à troll.java
					Troll.get().setTrollToModif(trollToModif);
					trouve=true;
					break;
				}
			}
			
			if(trouve)
			{
				Troll.get().changerPage(3);
			}
			else
			{
				Window.alert("Vous n'avez pas sélectionné de troll");
			}
			
		}
		if(event.getSource()==this.boutonNouveau)
		{
			Troll.get().changerPage(2);
		}
		if(event.getSource()==changeLang)
		{
			String url = Window.Location.getHref();
			String urlFinal = "";
			String[] urlSplit=url.split("&locale=");
			
			if(urlSplit.length<2)
			{
				urlFinal=Window.Location.getHref()+"&locale=en";
			}
			else
			{
				String lang = urlSplit[1];
				if(lang.compareTo("en")==0)
				{
					urlFinal=urlSplit[0]+"&locale=fr";
				}
				else
				{
					urlFinal=urlSplit[0]+"&locale=en";
				}
			}
			Window.Location.replace(urlFinal);
		}
	}

	public void onChange(ChangeEvent event) 
	{
		String race = this.lesRaces[this.listeRace.getSelectedIndex()];
		this.listeDesNoms.setTri(race);
	}
	

	
	
}
